#include <iostream>
#include <memory>
#include "TcpServer.hpp"  // 处理IO
#include "Calculator.hpp" // 处理业务

Calculator calculator;

// for debug 用于调试
void DefaultOnMessage(std::shared_ptr<Connection> connection_ptr)
{
    // 上层获取了一条消息
    std::cout << "Main Get a Message: " << std::endl
              << connection_ptr->GetInBuffer() << std::endl;

    std::string intmp = calculator.Handler(connection_ptr->GetInBuffer());

    if (intmp.empty())
    {
        // 为空则不处理
        return;
    }
    std::cout << intmp << std::endl;

    // 将数据进行发送 数据发送主要是调用connection_ptr中的写入操作

    /*
        写入操作与读取操作不同 
        对于读取操作而言 通常无法知道对端何时能将数据传给本端 从而需要关心读事件
        而对于本端而言进行发送时 能知道自己的写事件往往是在就绪状态的 
        因此可能导致写事件一直都在就绪导致epollserver经常返回从而浪费CPU资源
        因此对于写事件是否关心这件事上需要按照不同的场景来设置是否关心写事件
        ---- 读事件为常关心事件 写事件为按需关心事件
        在写入过程中如果写完则无需关心 若是没写完 发送缓冲区中还有数据则表示需要为写事件进行关心
    */
    connection_ptr->AppendOutBuffer(intmp);
    connection_ptr->_send_cb(connection_ptr);
    // connection_ptr->_tcp_server_ptr->Sender(connection_ptr);
}

int main()
{
    // std::cout << "hello world" << std::endl;
    std::shared_ptr<TcpServer> svr = std::make_shared<TcpServer>(8050, DefaultOnMessage);
    svr->Init();
    svr->Loop();
    return 0;
}